package cn.wen.yinxiu.member.service;

import cn.wen.yinxiu.common.to.system.NoticeTO;
import cn.wen.yinxiu.common.to.user.UserLoginTO;
import cn.wen.yinxiu.common.to.user.UserSimpleTO;
import cn.wen.yinxiu.common.to.user.UserTO;
import cn.wen.yinxiu.common.to.user.UserDataInfo;
import cn.wen.yinxiu.common.to.works.SimpleWorksTO;
import cn.wen.yinxiu.member.vo.*;
import com.baomidou.mybatisplus.extension.service.IService;
import cn.wen.yinxiu.common.toolkit.PageUtils;
import cn.wen.yinxiu.member.entity.UsersEntity;

import java.util.List;
import java.util.Map;

/**
 * 用户表
 *
 * @ClassName: UsersService
 * @Author 小飞
 * @Email coderwen22@163.com
 * @Date 2023-05-21 22:19:26
 * @Description:
 */
public interface UsersService extends IService<UsersEntity> {

    PageUtils queryPage(Map<String, Object> params);

    /**
     * 登陆校验
     *
     * @param account       用户ID
     * @param userPassword 用户密码
     * @return 登陆状态
     */
    boolean checkAuth(String account, String userPassword);

    /**
     * 用户用户基本信息
     *
     * @param userId 用户ID
     * @return 用户信息
     */
    UserInfoVO queryUserInfoById(Long userId);

    /**
     * 查询用户信息
     *
     * @param userId 用户ID
     * @return 用户信息
     */
    UserInfo queryUserInfo(Long userId);

    /**
     * 查询个人用户对话框列表
     *
     * @param userId 个人用户ID
     * @return 对话框列表
     */
    List<TalkBoxInfo> queryTalkBoxInfoList(Long userId);

    /**
     * 添加对话框
     *
     * @param userId   用户ID
     * @param talkId   好友ID
     * @param talkType 对话框类型[0：好友、1：群组]
     */
    void addTalkBoxInfo(Long userId, Long talkId, Integer talkType);

    /**
     * 查询个人用户好友列表
     *
     * @param userId 个人用户ID
     * @param page 当前页号
     * @return 好友列表
     */
    List<UserFriendInfo> queryUserFriendInfoList(Long userId, Integer page);


    /**
     * 查询个人用户群组列表
     *
     * @param userId 个人用户ID
     * @return 群组列表
     */
    List<GroupInfo> queryUserGroupInfoList(Long userId);

    /**
     * 模糊查询用户
     *
     * @param account    用户账号
     * @param searchKey 用户名、用户账号
     * @return < 10个用户集合
     */
    List<LuckUserInfo> queryFuzzyUserInfoList(String account, String searchKey);

    /**
     * 添加好友到数据库中
     *
     * @param userFriendList 好友集合
     */
    void addUserFriend(List<UserFriend> userFriendList);

    /**
     * 异步添加聊天记录
     *
     * @param chatRecordInfo 聊天记录信息
     */
    void asyncAppendChatRecord(ChatRecordInfo chatRecordInfo);

    /**
     * 查询聊天记录
     *
     * @param talkId   对方ID
     * @param userId   好友ID
     * @param talkType 对话类型；0好友、1群组
     * @return 聊天记录(pageSize条)
     */
    List<ChatRecordInfo> queryChatRecordInfoList(Long talkId, Long userId, Integer talkType, Integer page);

    /**
     * 删除用户对话框
     *
     * @param talkBoxId 对话框ID
     */
    void deleteUserTalk(Long talkBoxId);

    /**
     * 查询用户群组ID集合
     *
     * @param userId 用户ID
     * @return 用户群组ID集合
     */
    List<Long> queryUserGroupsIdList(Long userId);

    /**
     * 查询用户群组对话框
     *
     * @param userId 用户Id
     * @return       群组Id
     */
    List<Long> queryTalkBoxGroupsIdList(Long userId);


    /**
     * 通过账号查询用户信息
     * @param account
     * @return
     */
    UsersEntity queryUserInfoByAccount(String account);

    /**
     * 查询个人用户粉丝列表
     * @param userId
     * @param page
     * @return
     */
    List<UserFriendInfo> queryUserFansInfoList(Long userId, Integer page);

    /**
     * 将当前用户在粉丝关注中移除
     * @param userId
     * @param fansId
     * @return
     */
    boolean deleteUserFriendFromFansRelation(Long userId, Long fansId);

    /**
     * 取消关注
     * @param userId
     * @param friendId
     * @return
     */
    boolean deleteUserFriendRelation(Long userId, Long friendId);

    /**
     * 查询当前用户关注
     * @param query
     * @return
     */
    List<UserFriendInfo> searchUserFriendInfoList(UserFriendQuery query);

    /**
     * 查询当前用户粉丝信息列表
     * @param query
     * @return
     */
    List<UserFriendInfo> searchUserFansInfoList(UserFriendQuery query);

    /**
     * 获取用户头部的基本信息
     * @param userId
     * @return
     */
    HeaderNavUserInfoVO queryUserHeaderInfo(Long userId);

    /**
     * 获取当前正常的用户IDs
     *
     * @return
     */
    List<UserDataInfo> getUserIdList();

    /**
     * 服务调用获取用户信息
     * @param userId
     * @return
     */
    UserTO getUserToInfoById(Long userId);

    /**
     * 存储通知类型
     *
     * @param notice
     * @return
     */
    NoticeTO addNoticeInfo(NoticeTO notice);

    /**
     * 获取简易的作品信息
     * @param worksId
     * @return
     */
    SimpleWorksTO getSimpleWorksInfo(Long worksId);

    /**
     * 随机获取30位用户来实现随机
     *
     * @return
     */
    List<Long> getUserIdFind30();

    /**
     * 获取用户的关注ID
     *
     * @param userId
     * @return
     */
    List<Long> queryUserFollowIdList(Long userId);

    /**
     * 获取用户数据
     *
     * @param userId
     * @return
     */
    List<Long> queryUserFriendIdList(Long userId);

    /**
     * 通过号码获取用户的基本信息
     *
     * @param phone
     * @return
     */
    UserLoginTO getUserInfoByPhone(String phone);

    /**
     * 通过账号来获取用户的基本信息
     *
     * @param account
     * @return
     */
    UserLoginTO getUserInfoByAccount(String account);

    /**
     * 获取用户的基本信息 同时判断是否关注
     * @param userId
     * @param friendId
     * @return
     */
    UserSimpleTO getUserSimpleInfoById(Long userId, Long friendId);
}

